package com.itheima.studentsystem;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class App {

    //创建一个集合，用来存储用户登录信息
    static ArrayList<User> list = new ArrayList<>();

    //静态代码块 只执行一次
    static{
        User u1 = new User("zhangsan", "w123456",
                "123456789012345678", "12345678901");
        list.add(u1);
        User u2 = new User("lisi", "w123456",
                "22345678901234567x", "12345678902");
        list.add(u2);
    }//创建一些用户对象并存入集合

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);


        while (true) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请输入你的选择：1登录 2注册 3忘记密码 4退出");

            //键盘录入
            String choice = sc.next();

            //判断
            switch (choice) {
                case "1" -> login(list);
                case "2" -> register(list);
                case "3" -> forgetPassword(list);
                case "4" -> {
                    //退出
                    System.exit(0);
                }
                default -> System.out.println("输入错误，请重新输入");
            }
        }
    }

    //登录
    public static void login(ArrayList<User> list) {
        Random r = new Random();

        //定义一个计数器
        int count = 0;
        //判断用户名和密码是否正确,3次机会
        while (count < 3) {
            //获取验证码
            String code = getCode();

            //键盘录入
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名");
            String name = sc.next();
            //键盘录入密码
            System.out.println("请输入密码");
            String password = sc.next();
            //键盘录入验证码
            System.out.println("请输入验证码");
            System.out.println("验证码为：" + code);
            String userCode = sc.next();

            //判断是否注册，去集合里面找
            boolean contains = contains(list, name);
            if (!contains) {
                //运行到这里说明用户名不存在
                System.out.println("用户名不存在，请先注册");
                return;
            }

            //运行到这里说明用户名存在，可以登录
            //判断验证码是否正确
            if (!(userCode.equals(code))) {
                //验证码不正确
                System.out.println("验证码不正确，请重新登录");
                return;
            }

            //判断用户名和密码是否正确
            for (int i = 0; i < list.size(); i++) {
                boolean equals1 = list.get(i).getName().equals(name);
                boolean equals2 = list.get(i).getPassword().equals(password);
                //判断
                if (equals1 && equals2) {
                    //运行到这里说明用户名和密码都正确
                    System.out.println("登录成功");
                    //进入学生管理系统
                    StudentTest.mai();
                    //结束程序
                    return;
                }
            }
            //说明用户名或密码不正确
            System.out.println("用户名或密码不正确，请重新登录");
            count++;

        }
        System.out.println("登录超过3次，退出系统");
        return;
    }

    //注册
    public static void register(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);

        //键盘录入用户名
        String name = null;
        while (true) {
            System.out.println("请输入用户名");
            name = sc.next();

            //验证用户名是否合法
            Boolean flag = isName(list, name);
            if (flag) {
                break;
            } else {
                System.out.println("用户名不合法,注册失败,请重新输入");
            }
        }

        //运行到这里就说明用户名合法
        String password1 = null;
        //密码验证
        while (true) {
            //键盘录入密码
            System.out.println("请输入密码");
            password1 = sc.next();
            System.out.println("请再次输入密码");
            String password2 = sc.next();

            //判断两次密码是否一致
            if (password1.equals(password2)) {
                break;
            } else {
                //说明两次密码不一致
                System.out.println("两次密码不一致,注册失败,重新注册");
            }
        }

        //身份证验证
        String idName = null;
        while (true) {
            //键盘输入身份证号码
            System.out.println("请输入身份证号码");
            idName = sc.next();

            boolean idName1 = isIdName(list, name);
            if (idName1) {
                break;
            } else {
                System.out.println("身份证号码不合法,注册失败,重新输入");
            }
        }

        //手机号验证
        String phoneId = null;
        while (true) {
            System.out.println("请输入手机号");
            phoneId = sc.next();
            boolean phoneId1 = isPhoneId(list, phoneId);
            if (phoneId1) {
                break;
            } else {
                System.out.println("手机号不合法,注册失败,重新输入");
            }
        }

        //运行到这里说明所有的信息都是合法的

        //创建用户对象
        User u = new User();

        //把这些信息封装到用户对象中
        u.setName(name);
        u.setPassword(password1);
        u.setId(idName);
        u.setPhoneId(phoneId);

        //把用户对象添加到集合中
        list.add(u);

        //提示注册成功
        System.out.println("注册成功");

    }

    //忘记密码
    public static void forgetPassword(ArrayList<User> list) {

        //键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String name = sc.next();

        //判断用户名是否存在
        boolean contains = contains(list, name);
        //如果不存在，提示用户名不存在，返回主菜单
        if (!contains) {
            //不存在
            System.out.println("用户名不存在");
            return;
        }
        //如果存在，提示输入身份证号码
        System.out.println("请输入身份证号码");
        String idName = sc.next();
        System.out.println("请输入手机号");
        String phoneId = sc.next();

        int flag = 0;
        //判断身份证号码和手机号是否正确
        for (int i = 0; i < list.size(); i++) {
            boolean equals1 = list.get(i).getPhoneId().equals(phoneId);
            boolean equals2 = list.get(i).getId().equals(idName);
            if (equals1 && equals2) {
                //说明身份证号码和手机号正确
                flag = 1;
            }
        }
        if (flag == 0) {
            //说明身份证号码和手机号不正确
            System.out.println("账号信息不匹配，修改失败");
            return;
        }

        //运行到这里说明身份证号码和手机号正确
        //提示输入新密码
        System.out.println("请输入新密码");
        String newPassword = sc.next();
        //修改密码
        //获取要修改密码的索引
        int index = getIndex(list, name);
        list.get(index).setPassword(newPassword);
        System.out.println("修改成功");
    }

    //判断用户名是否存在
    public static boolean contains(ArrayList<User> list, String name) {
        return getIndex(list, name) >= 0;
    }

    //获取验证码
    public static String getCode() {
        Random r = new Random();

        char[] chs = new char[52];
        //循环遍历将字母存入数组
        for (int i = 0; i < chs.length; i++) {
            if(i<=25){
                chs[i]=(char)(i+'a');
            }else{
                chs[i]=(char)(i-26+'A');
            }
        }
        //循环出5个字符，后面直接拿随机数字覆盖随机位置的字母
        String code = "";
        for (int i = 0; i < 5; i++) {
            code += chs[r.nextInt(chs.length)];
        }

        //随机数字和索引
        int number = r.nextInt(10);
        int index = r.nextInt(5);

        //把code字符串转成字符数组
        char[] charArray = code.toCharArray();

        //把随机数字覆盖随机位置的字母
        charArray[index] = (char) (number + '0');

        //返回
        return new String(charArray);
    }

    //获取要修改密码的索引
    public static int getIndex(ArrayList<User> list, String name) {
        //先判断集合是否为空
        if (list.size() == 0) return -1;

        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            boolean equals = list.get(i).getName().equals(name);
            if (equals) {
                //存在
                return i;
            }
        }
        //不存在
        return -1;
    }

    //判断用户名格式是否正确
    public static boolean isName(ArrayList list, String name) {
        //判断用户名是否合法
        int len = name.length();
        if (len < 3 || len > 15) {
            return false;
        }

        //判断用户名组成是否合法
        //拿到这个name再取得里面每一个字符进行判断，
        // 如果存在字母和数字以外的字符，或者字母的数量小于1，则违法

        //定义一个计数器
        int count = 0;

        for (int i = 0; i < name.length(); i++) {
            char c = name.charAt(i);
            //判断
            if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                //合法
                //计算字母的数量
                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                    count++;
                }
            } else {
                //不合法
                return false;
            }
        }
        //判断
        if (count < 1) {
            //不合法
            return false;
        }

        //验证用户名是否存在
        boolean contains = contains(list, name);

        //如果存在，提示用户名已存在，注册失败
        if (contains) {
            //用户名存在
            return false;
        }
        return true;
    }

    //判断身份证号码是否合法
    public static boolean isIdName(ArrayList list, String idName) {

        //判断长度是否合法
        if (idName.length() != 18) {
            //不合法
            return false;
        }

        //判断组成是否合法
        //拿到这个idName再取得里面每一个字符进行判断
        // 如果存在字母和数字以外的字符，则违法

        //先判断第一个字符
        if (idName.charAt(0) <= '0' || idName.charAt(0) > '9') {
            //不合法
            return false;
        }
        //中间的16个字符
        for (int i = 1; i < idName.length(); i++) {
            //拿到每一个字符
            char c = idName.charAt(i);
            //判断
            if (!(c >= '0' && c <= '9')) {
                //不合法
                return false;
            }
        }
        //判断最后一个字符
        char c = idName.charAt(idName.length() - 1);
        if (!(c == 'x' || c == 'X' || (c >= '0' && c <= '9'))) {
            //不合法
            return false;
        }
        return true;

    }

    //判断手机号是否合法
    public static boolean isPhoneId(ArrayList list, String phoneId) {
        //判断长度是否合法
        if (phoneId.length() != 11) {
            //不合法
            return false;
        }

        //判断第一个字符
        if (!(phoneId.charAt(0) > '0' && phoneId.charAt(0) <= '9')) {
            //不合法
            return false;
        }

        //判断是否都是数字
        for (int i = 0; i < phoneId.length(); i++) {
            //拿到每一个字符
            char c1 = phoneId.charAt(i);
            //判断
            if (!(c1 >= '0' && c1 <= '9')) {
                //不合法
                return false;
            }
        }
        return true;
    }
}
